package com.campus.commons.utils.excel;


import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.util.*;

public class EasyPoiWrite {
    private static Workbook workbook;
    private static String fileSuffix = "";
    private static  int WIDTH=2000; //列宽
    private static  int HEIGHT=15;//行高

    /**
     * 设置实现类 03格式的
     * @param workbook
     */
   public static void setWorkbook(HSSFWorkbook workbook) {
        EasyPoiWrite.workbook=workbook;
       EasyPoiWrite.fileSuffix = ".xls";
    }


    /**
     * 设置默认列宽
     * @param WIDTH
     */
    public static void setDefaultWidthValue(int WIDTH) {
        EasyPoiWrite.WIDTH = WIDTH;
    }

    /**
     * 设置默认行高
     * @param HEIGHT
     */
    public static void setDefaultHeightValue(int HEIGHT) {
        EasyPoiWrite.HEIGHT = HEIGHT;
    }

    /**
     * 设置行高，跟列宽
     *  row.setHeightInPoints()
     *  sheet.setColumnWidth(i,1*WIDTH);                //设置列宽
     *  sheet.setDefaultRowHeightInPoints(HEIGHT);      //行高
     */
    /**
     * 设置连续区间的row 行高
     * @param startRow 开始行
     * @param endRow    结束行
     * @param times 默认的几倍
     */
    public static void setRowHeight(Sheet sheet,int startRow, int endRow,double  times) {
        for (int i = startRow; i <= endRow; i++) {
            Row row = sheet.createRow(i);
            row.setHeightInPoints((float) (Math.floor(times*HEIGHT)));
        }
    }

    /**
     * 设置非区间的行高
     * @param times 默认的几倍
     * @param rows  多个行
     */
    public static void setRowHeight(Sheet sheet,double  times,int ...rows) {
        for (int i : rows) {
            Row row = sheet.createRow(i);
            row.setHeightInPoints((float) (Math.floor(times*HEIGHT)));
        }
    }

    /**
     * 设置默认的所有行的高度
     */
    public static void setDefaultHeight(Sheet sheet, double times) {
        sheet.setDefaultRowHeightInPoints((float) (Math.floor(times*HEIGHT)));
    }

    /**
     * 设置指定的列大小
     * @param sheet
     * @param times 默认大小的倍数
     * @param cells 设置的列
     */
    public static void setCellWidth(Sheet sheet,double times,int ...cells) {
        for (int cell : cells) {
            sheet.setColumnWidth(cell, (int) (times*WIDTH));
        }
    }

    /**
     * 设置区间的列大小
     * @param sheet
     * @param times 默认的大小倍数
     * @param startCell 设置的开始列
     * @param endCell    结束列
     */
    public static void setCellWidth(Sheet sheet,double times,int startCell,int endCell) {
        for (int i =startCell; i <=endCell ; i++) {
            sheet.setColumnWidth(i, (int) (times*WIDTH));
        }
    }

    /**
     * 设置实现类  07格式的
     * @param workbook
     */
   public static void setWorkbook(SXSSFWorkbook workbook) {
       EasyPoiWrite.workbook=workbook;
       EasyPoiWrite.fileSuffix = ".xlsx";
    }


    /**
     * 获取样式:默认居中
     * @return
     */
    static CellStyle getCenterStyle() {
        CellStyle cellStyle = workbook.createCellStyle();
       return setCenterStyle(cellStyle);
    }
    /**在原有的样式上追加，
     * 获取样式:默认居中
     * @return
     */
    static CellStyle setCenterStyle(CellStyle cellStyle) {
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        return cellStyle;
    }

    /**
     * 获取边框样式
     * @return 返回新的样式
     */
    static CellStyle getBorderStyle() {
        CellStyle cellStyle = workbook.createCellStyle();
        return setBorderStyle(cellStyle);
    }

    /**
     * 追加边框样式
     * @param cellStyle
     * @return
     */
    static CellStyle setBorderStyle(CellStyle cellStyle) {
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);
        return cellStyle;
    }

    /**
     * 获取 文字垂直排版样式
     * @return
     */
    static CellStyle getRotationStyle() {
        CellStyle centerStyle = getCenterStyle();
       return setRotationStyle(centerStyle);
    }

    /**
     * 追加文字垂直排版样式
     * @param cellStyle
     * @return
     */

    static CellStyle setRotationStyle(CellStyle cellStyle) {
       cellStyle.setRotation(new Short("255"));
        return cellStyle;
    }

    /**
     * 获取字体加粗的样式
     * @return
     */
    static CellStyle getFontHeightStyle() {
        CellStyle cellStyle = workbook.createCellStyle();
       return setFontHeightStyle(cellStyle);
    }

    /**
     * 设置字体加粗
     * @param cellStyle
     * @return
     */
    static CellStyle setFontHeightStyle(CellStyle cellStyle) {
        Font font = workbook.createFont();
        font.setBold(true);
        cellStyle.setFont(font);
        return cellStyle;
    }

    /**
     * 获取文字大小样式
     * @param size 设置文字的字号
     * @return
     */
    static CellStyle getFontSizeStyle(int size) {
        CellStyle cellStyle = workbook.createCellStyle();
        return setFontSizeStyle(cellStyle,size);
    }
    /**
     * 设置字体大小
     * @param cellStyle 本来的样式
     * @param size 字体大小
     * @return
     */
    static CellStyle setFontSizeStyle(CellStyle cellStyle,int size) {
        Font font = workbook.createFont();
            font.setFontHeightInPoints((short) size);
        cellStyle.setFont(font);
        return cellStyle;
    }

    /**
     * 获取背景颜色样式
     * @param colorValue  颜色值
     * @return
     */
    static CellStyle getBackgroundColorStyle(int colorValue) {
        CellStyle cellStyle = workbook.createCellStyle();
       return setBackgroundColorStyle(cellStyle, colorValue);
    }

    /**
     * 追加 背景颜色样式
     * @param cellStyle 原有样式
     * @param colorValue 颜色值
     * @return
     */
    static CellStyle setBackgroundColorStyle(CellStyle cellStyle,int colorValue) {
        cellStyle.setFillForegroundColor((short) colorValue);// 设置背景色
        return cellStyle;
    }

    /**
     * 获取文本换行样式
     * @param enable 是否换行
     * @return
     */
    static CellStyle getWrapLineStyle(boolean enable) {
        CellStyle cellStyle = workbook.createCellStyle();
       return setWrapStyle(cellStyle, enable);
    }

    /**
     * 追加文本换行样式
     * @param cellStyle 原样式
     * @param enable  true 开始|关闭 false
     * @return
     */
    static CellStyle setWrapStyle(CellStyle cellStyle,boolean enable) {
        cellStyle.setWrapText(enable);
        return cellStyle;
    }

    /**
     *  传入特定参数： 生成主体内容
     * @param list 集合，里面格式 List<String> 每个项
     * @param startRow 开始行
     * @param startCel 开始列
     * @param
     * @param
     */
    public  static  void setMain(Sheet sheet,List<List<String>> list,int startRow,int startCel) {
        for (List<String> t : list) {
            Row row = sheet.createRow(startRow);
            for (String value : t) {
                Cell cell = row.createCell(startCel);
                cell.setCellValue(value);
                startCel++;//换列
            }
            startRow++;//换行
        }
    }

    /**
     * 添加合并单元格并设置其值
     * @param sheet  当前页对象
     * @param startRow 开始行
     * @param endRow    结束行
     * @param startCel 开始列
     * @param endCel    结束列
     * @param content   内容
     * return 合并的起始列。
     */
    public static Cell setMergedRegion(Sheet sheet, int startRow, int endRow, int startCel, int endCel, String content) {
        sheet.addMergedRegionUnsafe(new CellRangeAddress(startRow, endRow, startCel, endCel));
        Cell cell = sheet.createRow(startRow).createCell(startCel);
        cell.setCellValue(content);
        cell.setCellStyle(getCenterStyle());
        return cell;
    }

    /**
     * 暂未开发
     */
    @Deprecated
    public static void close() {

    }


}

